package cn.kbyue.security.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 接口统一返回json结果
 * @param <T> 参数data类型
 * @author xl
 * @date 2020/4/11
 */
@Data
@Accessors(chain = true)
public class Result<T> {
    /**
     * 响应状态码
     */
    private Integer status;
    /**
     * 是否请求成功的标志
     */
    private Boolean success;
    /**
     * 保存的数据
     */
    private T data;
    /**
     * 传递的信息
     */
    private String message;

    /**
     * 返回提示信息
     * @param message 信息
     * @return Result
     */
    public static Result<Object> success(String message) {
        return new Result<>()
                .setSuccess(true)
                .setStatus(0)
                .setMessage(message);
    }

    /**
     * 返回数据
     * @param data 数据
     * @param <T> 数据类型
     * @return Result
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>().setData(data)
                .setSuccess(true)
                .setStatus(0);
    }

    /**
     * 返回提示信息和数据
     * @param message 提示信息
     * @param data 数据
     * @param <T> 数据类型
     * @return Result
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<T>().setData(data)
                .setSuccess(true)
                .setStatus(0)
                .setMessage(message);
    }

    /**
     * 返回错误提示信息
     * @param message 错误提示
     * @return Result
     */
    public static Result<Object> error(String message) {
        return new Result<>()
                .setStatus(-1)
                .setSuccess(false)
                .setMessage(message);
    }

    /**
     * 返回自定义status和message
     * @param status 状态码
     * @param message 提示信息
     * @return Result
     */
    public static Result<Object> error(Integer status, String message) {
        return new Result<>()
                .setStatus(status)
                .setSuccess(false)
                .setMessage(message);
    }

    /**
     * 返回自定义的错误枚举信息
     * @param enums BizExceptionEnum
     * @return Result
     */
    public static Result<Object> error(BizExceptionEnum enums) {
        return new Result<>()
                .setStatus(enums.getCode())
                .setSuccess(false)
                .setMessage(enums.getMessage());
    }

    /**
     * 直接打印 response 内容
     * @param response HttpServletResponse
     * @param result Result json
     */
    public static void responseResult(HttpServletResponse response, Result<Object> result) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String responseString = objectMapper.writeValueAsString(result);

        response.setHeader("Content-type", "application/json;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println(responseString);
        writer.flush();
        writer.close();
    }
}
